iT邦幫忙

2021 iThome 鐵人賽

DAY 17
0

在語句中常會出現概念相似的詞,包括某類物品、地名、時間...等。例如,輪椅、拐杖、助行器、電動床都屬於輔具實體;早上、中午、下午、傍晚屬於時間實體。將這些詞語對應到所屬的類別,可以使程式判斷使用者意圖時更貼近。

本研究使用 JSON 檔案紀錄詞語及其實體,並在程式完成斷詞後,將詞語一一對應到實體。需要增加實體時,可以直接修改檔案。
實體對應設定檔: https://gitlab.com/graduate_lab415/nlp/-/blob/master/docs/entities_config.json

部分實體對應截圖

程式講解

完整程式在這邊: https://gitlab.com/graduate_lab415/nlp/-/blob/master/main.py

設定是否加標籤

首先我在最上方的設計了一個變數,控制是否要為問句加上標籤。

"""
LABEL = True | False
default: True
"""
LABEL = True

判斷是否加標籤

接著程式會判斷本次製作模型,是否需要加標籤。若是,執行下方程式碼;若否跳過此段不執行。

"""use labeled or unlabeled"""
if LABEL:
    label_conf = json.load(open("/home/yr/PycharmProjects/nlp/docs/entities_config.json", "r"))
    docs_words_labeled = list()
    for doc_words in docs_words:
        doc_labeled = add_label(doc_words, label_conf)
    docs_words = docs_words_labeled

open("檔案位址", "讀取模式") 是開啟前面我們設計好的設定檔。因為剛讀入的設定檔是純文字,因此接著使用 json.load() 將它轉成 json 格式。接下來使用迴圈為每一句問句加上標籤,並存入 docs_words_labeled 的 list 之中。

加標籤函式

主要負責為句子加上標籤。

def add_label(doc,
              label_config=json.load(open("/home/yr/PycharmProjects/nlp/docs/entities_config.json", "r"))):
    """labeling"""
    doc_tmp = list()
    for word in doc:
        word_tmp = word
        for entity_name in label_config:
            if word in label_config[entity_name]:
                word_tmp = entity_name
        doc_tmp.append(word_tmp)
    docs_words_labeled.append(doc_tmp)
    if LOG:
        print("before labeling:\t{}".format(doc))
        print("after labeling:\t\t{}".format(doc_tmp))
    return doc_tmp

先講參數部分

  • doc: 要加標籤的句子
  • label_config: 標籤的設定檔。這邊是 Python 的一個特別的寫法,當沒有傳入參數時,直接使用預設值。

昨天我們先斷過詞了,所以接下是把每詞拿出來和設定檔比對若有符合,就把詞的部分改成標籤。像是這樣:

Before: ["請問", "哪裡", "可以", "借", "輪椅"]
After:  ["請問", "哪裡", "可以", "借", "<輔具>"]

如此一來,不管今天使用者想借的是什麼輔具,都可以對應到問題囉!



上一篇
Day 16 - [語料庫模型] 04-斷詞工具比較 Jieba vs CKIP
下一篇
Day 18 - [語料庫模型] 06-程式碼: TF、IDF、TF-IDF
系列文
長照小幫手 - 從 0 開始建置 Chatbot 的筆記 & 走錯路的心得31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言